#ifndef __CHIP_ADC_HPP__
#define __CHIP_ADC_HPP__

#include <iostream>
#include <string>

extern "C"
{
#include <rtthread.h>
#include <rtdevice.h>
#include <math.h>
#include <stdint.h>
#include <filter_algorithm.h>
}

typedef enum
{
    chip_adc_status_fail,
    chip_adc_status_ok,
} chip_adc_status;


class CHIP_ADC
{
private:
    chip_adc_status init_flag;
    uint8_t debug_flag;
    rt_adc_device_t adc_dev;

    double latest_value;
    rt_mutex_t latest_value_lock;
    uint32_t adc_channel;
    std::string adc_dev_name;

public:

    FA_Filter_Type filter_type;
    int sample_num_per_mesure;//每次采样需要多少个点进入滤波器计算

private:
    double (*_transfer_adc_value_to_need)(uint32_t adc_value);
    uint32_t (*_filter)(uint8_t N,uint32_t *value_buf);
public:
    /*重要参数说明：
        参数：double (*transfer_adc_value_to_need)(uint32_t adc_value)
        说明：
        需要在外部完成一个函数，并传入该函数指针
        外部完成的函数主要功能为：将一个《经过滤波等前期处理后的》ADC值转换为实际需要值的接口函数
        该函数将在CHIP_ADC_measure中最后被运行
        该函数推荐完成工作：
        ADC值->该函数->实际需要的值（可直接使用）
        为什么要这么做：
        接口电路并不能够保证完全相同，也没有很高的重复性
        故，大量在程序中书写所有可能性被认为是不可行方案（例如：参考电压、分压电阻不同）

        参数：filter_type
        允许值：
        FA_Filter_Type_MV 中位值滤波算法
        FA_Filter_Type_AA 算术平均滤波算法
    */

    CHIP_ADC(std::string adc_dev_name,
             uint32_t adc_channel,
             int per_mesure_sample_num,
             FA_Filter_Type filter_type,
             double (*transfer_adc_value_to_need)(uint32_t adc_value));
    ~CHIP_ADC();

    void CHIP_ADC_open_debug();
    void CHIP_ADC_close_debug();

    chip_adc_status CHIP_ADC_change_channel(uint32_t new_channel);
    chip_adc_status CHIP_ADC_change_transfer_function(double (*_t_f)(uint32_t adc_value));
    double CHIP_ADC_measure();
    double CHIP_ADC_read_latest_value_buff();

    chip_adc_status CHIP_ADC_read_init_status();
};

#endif /*__CHIP_ADC_HPP__*/

